class Solution {
public:
    bool canJump(vector<int>& nums) {
        // 怎么跳，跳几步不重要，关键在于覆盖范围
        int n = nums.size();
        int cover = 0;      // 初始化最开始的覆盖范围，这里cover指的是右边界下标

        // 只有在覆盖范围内遍历才有意义
        // 比如[0, 2, 2]，刚开始覆盖范围是0，第一次for循环进去了，更新完cover还是0，此时再i++就没有意义了，因为已经超出覆盖范围了
        // 比如[2, 3, 1, 1, 4]， 比如遍历完2之后的cover就是2了，i++之后i=1，此时nums[i]是3，那么cover更新为1+3=4，直接覆盖了最后一个位置
        for(int i = 0; i <= cover; i++)
        {
            cover = max(cover, nums[i] + i);
            if(cover >= n - 1)
                return true;
        }
        return false;
    }
};